home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / util1 / yk211src.lha / Yak_2.11_Src / Prefs / BGUI / Keydef_window.c < prev    next >
C/C++ Source or Header  |  1995-11-16  |  21KB  |  528 lines

  1. /************************************************************************
  2. **********************  BGUI KEYDEFINITION WINDOW  **********************
  3. ************************************************************************/
  4.  
  5. #include <exec/types.h>
  6. #include <exec/memory.h>
  7. #include <dos/dosextens.h>
  8. #include <intuition/intuition.h>
  9. #include <intuition/classes.h>
  10. #include <intuition/classusr.h>
  11. #include <intuition/imageclass.h>
  12. #include <intuition/gadgetclass.h>
  13. #include <intuition/intuitionbase.h>
  14. #include <libraries/bgui.h>
  15. #include <libraries/bgui_macros.h>
  16. #include <libraries/commodities.h>
  17. #include <proto/commodities.h>
  18. #include <proto/exec.h>
  19. #include <proto/intuition.h>
  20. #include <proto/bgui.h>
  21. #include <proto/wb.h>
  22. #include <clib/alib_protos.h>
  23. #include <string.h>
  24.  
  25. #include "code.h"
  26. #include "version.h"
  27. #include "yak.h"
  28. #include "hotkey_types.h"
  29. #include "handlers.h"
  30. #include "keydef.h"
  31. #include "gui.h"
  32. #include "KeyDef_Window.h"
  33. #include "Requesters.h"
  34. #include "yak_locale_strings.h"
  35.  
  36. /************************************************************************
  37. *****************************  REFERENCES  ******************************
  38. ************************************************************************/
  39.  
  40. IMPORT LONG (*HandleReturnID)(LONG ID);
  41. IMPORT UBYTE ParentWindowID;
  42. IMPORT char *PrefsHelp;
  43.  
  44. extern void HookEntry(void);                    /* from amiga.lib */
  45.  
  46. /************************************************************************
  47. *****************************  PROTOTYPES  ******************************
  48. ************************************************************************/
  49.  
  50. static void InitHook(struct Hook *hook,ULONG (*hookfn)(),APTR data);
  51.  
  52. static SAVEDS ASM ULONG KeyDefWindowHandler(REG(a0) struct Hook *hook, REG(a2) void *obj, REG(a1) void *msg);
  53.  
  54. /************************************************************************
  55. *****************************  LOCAL DATA  ******************************
  56. ************************************************************************/
  57.  
  58. struct Window           *KeyDefWnd = NULL;
  59. Object                  *KeyDefWndObj = NULL;
  60. Object                  *KeyDefObjects[KeyDef_CNT];
  61. char                    *KeyDefWdt;
  62. struct IBox              KeyDefBox;
  63. BOOL                     KeyDefBoxValid = FALSE;
  64.  
  65. struct Hook              KeyDefWindowHook;
  66.  
  67. static APTR      CurObj;
  68. static YakKeyDef KeyDef;
  69.  
  70. UBYTE *Class0Labels[5];
  71. UBYTE *Stroke0Labels[4];
  72.  
  73. /************************************************************************
  74. *****************************  INITHOOK()  ******************************
  75. *************************************************************************
  76. * Initialize the hook struct supplied with the hook function and
  77. * (optional) hook data ptr.
  78. *
  79. *************************************************************************/
  80.  
  81. static void InitHook(struct Hook *hook,ULONG (*hookfn)(),APTR data)
  82. {
  83. hook->h_Entry = (ULONG (*)()) HookEntry;
  84. hook->h_SubEntry = hookfn;
  85. hook->h_Data = data;
  86. }
  87.  
  88. /************************************************************************
  89. ************************  CREATEKEYDEFWINDOW()  *************************
  90. *************************************************************************
  91. * Create the keydef window object tree. Returns the window object ptr or
  92. * NULL if create failed. Gadgets are initialised with default values,
  93. * InitKeyDefGadgets must be called after window opened to reflect current
  94. * settings.
  95. *
  96. *************************************************************************/
  97.  
  98. APTR CreateKeyDefWindow(VOID)
  99. {
  100. Object  *obj;
  101.  
  102. /* put localised strings into cycle gadget labels */
  103. Class0Labels[0] = getString(RawKey_CLASS);
  104. Class0Labels[1] = getString(RawMouse_CLASS);
  105. Class0Labels[2] = getString(DiskInserted_CLASS);
  106. Class0Labels[3] = getString(DiskRemoved_CLASS);
  107. Class0Labels[4] = NULL;
  108.  
  109. Stroke0Labels[0] = getString(Down_STROKE);
  110. Stroke0Labels[1] = getString(Up_STROKE);
  111. Stroke0Labels[2] = getString(Down_Up_STROKE);
  112. Stroke0Labels[3] = NULL;
  113.  
  114. /* initialize the window idcmp hook */
  115. InitHook(&KeyDefWindowHook,KeyDefWindowHandler,NULL);
  116.  
  117. obj = WindowObject,
  118.         WINDOW_PubScreenName, PubScreenName,
  119.         WINDOW_Title,           KeyDefWdt,
  120.         WINDOW_ScreenTitle,     getString(COPYRIGHT_STRING),
  121.         WINDOW_SmartRefresh, TRUE,
  122.         WINDOW_SizeBottom,      FALSE,                  /* put size gadget in right border */
  123.         WINDOW_SizeRight,       TRUE,
  124.         WINDOW_AutoAspect,      TRUE,                   /* automatic edges pixel width */
  125.         WINDOW_Position,        POS_CENTERMOUSE,
  126.         (KeyDefBoxValid ? WINDOW_Bounds : TAG_IGNORE), &KeyDefBox,
  127.         WINDOW_AppWindow,       TRUE,                   /* make it an appwindow */
  128.         WINDOW_RMBTrap,         TRUE,                   /* trap rmb - no menu */
  129.         WINDOW_CloseGadget,     FALSE,                  /* no windowclose gadget please */
  130.         WINDOW_IDCMP,           IDCMP_MOUSEBUTTONS,     /* additional idcmp bits */
  131.         WINDOW_IDCMPHookBits, IDCMP_RAWKEY|IDCMP_MOUSEBUTTONS,
  132.         WINDOW_IDCMPHook,       &KeyDefWindowHook,
  133.         (TextFont ? WINDOW_Font : TAG_IGNORE),  &Attr,  /* use font if specified */
  134.         WINDOW_MasterGroup,
  135.                 VGroupObject, Spacing(4), HOffset(4), VOffset(4),
  136.                         StartMember,
  137.                                 HGroupObject, Spacing(8),
  138.                                         StartMember,
  139.                                                 CYC_Class = CycleObject,
  140.                                                         LAB_Label,              getString(CLASS_STRING),
  141.                                                         GA_ID,                  GD_Class,
  142.                                                         ButtonFrame,
  143.                                                         CYC_Labels,             Class0Labels,
  144.                                                         CYC_Active,             0,
  145.                                                         CYC_Popup,              TRUE,
  146.                                                 EndObject,
  147.                                         EndMember,
  148.                                         VarSpace(DEFAULT_WEIGHT/10),
  149.                                         StartMember,
  150.                                                 CYC_Stroke = CycleObject,
  151.                                                         LAB_Label,              getString(STROKE_STRING),
  152.                                                         GA_ID,                  GD_Stroke,
  153.                                                         ButtonFrame,
  154.                                                         CYC_Labels,             Stroke0Labels,
  155.                                                         CYC_Active,             0,
  156.                                                         CYC_Popup,              TRUE,
  157.                                                 EndObject,
  158.                                         EndMember,
  159.                                 EndObject,
  160.                         EndMember,
  161.                         VarSpace(DEFAULT_WEIGHT/10),
  162.                         StartMember,
  163.                                 STR_Desc = StringObject,
  164.                                         LAB_Label,              getString(DESC_STRING),
  165.                                         STRINGA_MaxChars,256,
  166.                                         GA_ID,                  GD_Desc,
  167.                                         RidgeFrame,
  168.                                 EndObject,
  169.                         EndMember,
  170.                         VarSpace(DEFAULT_WEIGHT/10),
  171.                         StartMember,
  172.                                 HorizSeparator,
  173.                         EndMember,
  174.                         StartMember,
  175.                                 HGroupObject, Spacing(2),
  176.                                         StartMember,
  177.                                                 BT_Ok = Button(getString(OK_STRING),GD_Ok),
  178.                                         EndMember,
  179.                                         VarSpace(DEFAULT_WEIGHT),
  180.                                         StartMember,
  181.                                                 BT_Clear = Button(getString(CLEAR_STRING),GD_Clear),
  182.                                         EndMember,
  183.                                         VarSpace(DEFAULT_WEIGHT),
  184.                                         StartMember,
  185.                                                 BT_Help = Button(getString(HELP_STRING),GD_Help),
  186.                                         EndMember,
  187.                                         VarSpace(DEFAULT_WEIGHT),
  188.                                         StartMember,
  189.                                                 BT_Cancel2 = Button(getString(CANCEL_STRING),GD_Cancel),
  190.                                         EndMember,
  191.                                 EndObject,
  192.                         EndMember,
  193.                 EndObject,
  194.         EndObject;
  195.  
  196. return(obj);
  197. }
  198.  
  199. /************************************************************************
  200. *************************  CLOSEKEYDEFWINDOW()  *************************
  201. *************************************************************************
  202. * Close the keydef window, disposing of the window object.
  203. *
  204. *************************************************************************/
  205.  
  206. void CloseKeyDefWindow(void)
  207. {
  208. if (KeyDefWnd)
  209.         {
  210.         GetAttr(WINDOW_Bounds,KeyDefWndObj,(ULONG *) &KeyDefBox);
  211.         KeyDefBoxValid = TRUE;
  212.         }
  213.  
  214. DisposeObject(KeyDefWndObj);
  215. KeyDefWndObj = NULL;
  216. KeyDefWnd = NULL;
  217.  
  218. /* Re-enable Yak now that our job is finished */
  219. BrokerCommand("Yak", CXCMD_ENABLE);
  220. }
  221.  
  222. /************************************************************************
  223. ************************  INITKEYDEFGADGETS()  **************************
  224. *************************************************************************
  225. * Initialize the keydef window gadgets to reflect current settings.
  226. *************************************************************************/
  227.  
  228. static void InitKeyDefGadgets(void)
  229. {
  230. UBYTE   SeqString[127];
  231. BOOL    SeqOk;
  232.  
  233. SeqOk = BuildKeyDef(&KeyDef, SeqString);
  234.  
  235. InitWindowGadget(GDX_Class, CYC_Active, KeyDef.ykd_Class, KEYDEF_WINDOW);
  236.  
  237. if (ParentWindowID == MCYCLING_WINDOW)
  238.         InitWindowGadget(GDX_Class, GA_Disabled, KeyDef.ykd_Class, KEYDEF_WINDOW);
  239.  
  240. InitWindowGadget(GDX_Desc,   STRINGA_TextVal, (LONG)SeqString,   KEYDEF_WINDOW);
  241. InitWindowGadget(GDX_Stroke, CYC_Active,      KeyDef.ykd_Stroke, KEYDEF_WINDOW);
  242. InitWindowGadget(GDX_Stroke, GA_Disabled,     KeyDef.ykd_Class,  KEYDEF_WINDOW);
  243. InitWindowGadget(GDX_Ok,     GA_Disabled,     !SeqOk,            KEYDEF_WINDOW);
  244. }
  245.  
  246. /************************************************************************
  247. ***********************  SWITCHTOKEYDEFWINDOW()  ************************
  248. *************************************************************************
  249. * Switch to keydef window from another window, which will be closed by
  250. * this routine. Supply the parent window ID, the object whose key
  251. * definition you want edited (YakHotKey if from hotkey window, YakHandler
  252. * if from Misc window), and an 'action' string which appears in the
  253. * window title (tells the user what s/he's editing). Returns TRUE or
  254. * FALSE to indicate success.
  255. *
  256. *************************************************************************/
  257.  
  258. BOOL SwitchToKeyDefWindow(UBYTE I_ParentWindowID, APTR I_object, char *I_action)
  259. {
  260. static char     title[80];
  261. char            *def;
  262.  
  263. strcpy(title, getString(KeyDef_Window_TITLE));
  264. strcat(title, " ");
  265. if (I_action)
  266.         strcat(title, I_action); 
  267. else
  268.         strcat(title, "<<unnamed>>"); 
  269. KeyDefWdt = title;
  270.  
  271. ParentWindowID = I_ParentWindowID;
  272. CurObj         = I_object;
  273.  
  274. if (ParentWindowID == HOTKEY_WINDOW)
  275.         def = ((YakHotKey *)CurObj)->yhk_KeyDef;
  276. else
  277.         def = ((YakHandler *)CurObj)->KeyDef;
  278.  
  279. ParseKeyDef(def, &KeyDef);
  280.  
  281. CloseWindowID(ParentWindowID);
  282.  
  283. return(ShowKeyDefWindow());
  284. }
  285.  
  286. /************************************************************************
  287. ***********************  HANDLEKEYDEFRETURNID()  ************************
  288. *************************************************************************
  289. * Handle msgs arriving at keydef window - supply the ID returned by
  290. * BGUI. Returns either RET_OKAY or RET_QUIT.
  291. *
  292. *************************************************************************/
  293.  
  294. LONG HandleKeyDefReturnID(LONG id)
  295. {
  296. LONG    ret;
  297. ULONG   code;
  298.  
  299. ret = RET_OKAY;
  300.  
  301. switch(id)
  302.         {
  303.         case GD_Class:
  304.                 GetAttr(CYC_Active,CYC_Class,&code);
  305.                 KeyDef.ykd_Class  = code;
  306.                 KeyDef.ykd_Stroke = HKSTROKE_DOWN;
  307.                 KeyDef.ykd_Code   = NO_IECODE;
  308.                 KeyDef.ykd_Qual = KeyDef.ykd_IQual = KeyDef.ykd_SQual = NO_IEQUALIFIER;
  309.                 InitKeyDefGadgets();
  310.                 break;
  311.  
  312.         case GD_Stroke:
  313.                 GetAttr(CYC_Active,CYC_Stroke,&code);
  314.                 if ((KeyDef.ykd_Stroke=code) == HKSTROKE_UP)
  315.                         {
  316.                         KeyDef.ykd_Qual  &= ~IEQUALIFIER_REPEAT;
  317.                         KeyDef.ykd_IQual &= ~IEQUALIFIER_REPEAT;
  318.                         }
  319.                 InitKeyDefGadgets();
  320.                 break;
  321.  
  322.         case GD_Desc:
  323.                 GetAttr(STRINGA_TextVal,STR_Desc,&code);
  324.                 if (ParseKeyDef((char *)code, &KeyDef) == -1)
  325.                         PostError(getString(Invalid_hotkey_specif_ERR));
  326.                 InitKeyDefGadgets();
  327.                 break;
  328.  
  329.         case GD_Cancel:
  330.                 CloseKeyDefWindow();
  331.                 if (!ShowWindowID(ParentWindowID))
  332.                         ret = RET_QUIT;
  333.                 break;
  334.  
  335.         case GD_Help:
  336.                 DisableYakInterface();
  337.                 BrokerCommand("Yak", CXCMD_ENABLE);
  338.                 BGUI_Help(KeyDefWnd, PrefsHelp, "Hotkey Description String",0);
  339.                 BrokerCommand("Yak", CXCMD_DISABLE);
  340.                 ActivateWindow(KeyDefWnd);
  341.                 EnableYakInterface();
  342.                 break;
  343.  
  344.         case GD_Clear:
  345.                 KeyDef.ykd_Stroke = HKSTROKE_DOWN;
  346.                 KeyDef.ykd_Code   = NO_IECODE;
  347.                 KeyDef.ykd_Qual   = KeyDef.ykd_IQual = KeyDef.ykd_SQual = NO_IEQUALIFIER;
  348.                 InitKeyDefGadgets();
  349.                 break;
  350.  
  351.         case GD_Ok:
  352.                 GetAttr(STRINGA_TextVal,STR_Desc,&code);
  353.                 if (ParentWindowID == HOTKEY_WINDOW)
  354.                         {
  355.                         if (ModifyYHKKeyDef(CurObj, (char *)code) == TRUE)
  356.                                 {
  357.                                 /* Turn hotkey on active by default */
  358.                                 ((YakHotKey *)CurObj)->yhk_State = YKHK_ACTIVE;
  359.                                 }
  360.                         }
  361.                 else
  362.                         {
  363.                         char            *newdef;
  364.                         YakHandler      *curhd;
  365.  
  366.                         if (newdef = DupStr((char *)code))
  367.                                 {
  368.                                 curhd = (YakHandler *)CurObj;
  369.                                 FreeVec(curhd->KeyDef);
  370.                                 curhd->KeyDef = newdef;
  371.                                 }
  372.                         else
  373.                                 PostError(getString(Allocation_ERR));
  374.                         }
  375.                 CloseKeyDefWindow();
  376.                 if (!ShowWindowID(ParentWindowID))
  377.                         ret = RET_QUIT;
  378.                 break;
  379.  
  380.         default:
  381.                 break;
  382.         }
  383.  
  384. return(ret);
  385. }
  386.  
  387. /************************************************************************
  388. ************************  KEYDEFWINDOWHANDLER()  ************************
  389. *************************************************************************
  390. * Hook called by bgui during idcmp msg processing. Used here to scan
  391. * input for codes and qualifiers to put in hotkey description string.
  392. *
  393. *************************************************************************/
  394.  
  395. static SAVEDS ASM ULONG KeyDefWindowHandler(REG(a0) struct Hook *hook, REG(a2) void *obj, REG(a1) void *msg)
  396. {
  397. struct IntuiMessage     *imsg;
  398. UWORD                           code,qual,newqual;
  399.  
  400. imsg = (struct IntuiMessage *)msg;
  401. code = imsg->Code;
  402. qual = imsg->Qualifier;
  403.  
  404. switch(imsg->Class)
  405.         {
  406.         case IDCMP_RAWKEY:
  407.                 if ( (!(code & IECODE_UP_PREFIX) || code == 0xe2 ) && /* a downstroke || capslock up */
  408.                                 ((KeyDef.ykd_Class == HKCLASS_RAWKEY) || (KeyDef.ykd_Class == HKCLASS_RAWMOUSE)) )
  409.                         {
  410.                         if (newqual = IsQualifierPad(code))
  411.                                 {
  412.                                 newqual &= ~KeyDef.ykd_SQual;
  413.                                 newqual &= ~KeyDef.ykd_IQual;
  414.  
  415.                                 /* Toggle Qualifier */
  416.                                 KeyDef.ykd_Qual ^= newqual;
  417.                                 }
  418.                         else
  419.                 {
  420.                                 if (KeyDef.ykd_Class == HKCLASS_RAWKEY)
  421.                                         {
  422.                                         if ((code == KeyDef.ykd_Code) && (KeyDef.ykd_Stroke != HKSTROKE_UP))
  423.                                                 {
  424.                                                 /* Toggle Repeat Keyword */
  425.                                                 if(!(KeyDef.ykd_IQual & IEQUALIFIER_REPEAT))
  426.                                                         KeyDef.ykd_Qual  ^= IEQUALIFIER_REPEAT;
  427.                                                 }
  428.                                         else    /* New key or upstroke mode */
  429.                                                 {
  430.                                                 KeyDef.ykd_Qual  &= ~IEQUALIFIER_KEYS;
  431.                                                 KeyDef.ykd_IQual &= ~IEQUALIFIER_KEYS;
  432.                                                 KeyDef.ykd_Qual  |= qual & IEQUALIFIER_NUMERICPAD;
  433.                                                 KeyDef.ykd_Code   = code;
  434.                                                 }
  435.                                         }
  436.                                 }
  437.  
  438.                         InitKeyDefGadgets();
  439.                         }
  440.                 break;
  441.  
  442.         case IDCMP_MOUSEBUTTONS:
  443.                 if (!(code & IECODE_UP_PREFIX) && /* a downstroke */
  444.                                 ((KeyDef.ykd_Class == HKCLASS_RAWKEY) || (KeyDef.ykd_Class == HKCLASS_RAWMOUSE)) )
  445.                         {
  446.                         switch(code)
  447.                                 {
  448.                                 case IECODE_RBUTTON:
  449.                                         newqual = IEQUALIFIER_RBUTTON;
  450.                                         break;
  451.                                 case IECODE_LBUTTON:
  452.                                         newqual = IEQUALIFIER_LEFTBUTTON;
  453.                                         break;
  454.                                 case IECODE_MBUTTON:
  455.                                         newqual = IEQUALIFIER_MIDBUTTON;
  456.                                         break;
  457.                                 default:
  458.                                         newqual = NO_IEQUALIFIER;
  459.                                         break;
  460.                                 }
  461.  
  462.                         newqual &= ~KeyDef.ykd_IQual;
  463.  
  464.                         if (KeyDef.ykd_Class == HKCLASS_RAWMOUSE)
  465.                                 {
  466.                                 if (KeyDef.ykd_Code == code)
  467.                                         {
  468.                                         KeyDef.ykd_Qual &= ~newqual;
  469.                                         KeyDef.ykd_Code  = NO_IECODE;
  470.                                         }
  471.                                 else
  472.                                         {
  473.                                         KeyDef.ykd_Qual |= newqual;
  474.                                         KeyDef.ykd_Code  = code;
  475.                                         }
  476.                                 }
  477.                         else
  478.                                 KeyDef.ykd_Qual  ^= newqual;
  479.  
  480.                         InitKeyDefGadgets();
  481.                         }
  482.                 break;
  483.  
  484.         default:
  485.                 break;
  486.         }
  487.  
  488. return(0);
  489. }
  490.  
  491. /************************************************************************
  492. *************************  SHOWKEYDEFWINDOW()  **************************
  493. *************************************************************************
  494. * Create and open the KeyDef window and initialize the gadgets to
  495. * reflect current settings. Sets up HandleReturnID function, curwin,
  496. * curwinobj and curwinID. Returns TRUE or FALSE to indicate success.
  497. *
  498. *************************************************************************/
  499.  
  500. BOOL ShowKeyDefWindow(void)
  501. {
  502. if (KeyDefWndObj = (Object *)CreateKeyDefWindow())
  503.         {
  504.         if (KeyDefWnd = WindowOpen(KeyDefWndObj))
  505.                 {
  506.                 /* Disable Yak so that it doesn't interfere with us */
  507.                 BrokerCommand("Yak", CXCMD_DISABLE);
  508.  
  509.                 InitKeyDefGadgets();
  510.                 HandleReturnID = HandleKeyDefReturnID;
  511.                 curwin = KeyDefWnd;
  512.                 curwinobj = KeyDefWndObj;
  513.                 curwinID = KEYDEF_WINDOW;
  514.                 return(TRUE);
  515.                 }
  516.         }
  517.  
  518. CloseKeyDefWindow();
  519. curwin = NULL;
  520. curwinobj = NULL;
  521. wndsigflag = 0L;
  522. appwinsigflag = 0L;
  523. return(FALSE);
  524. }
  525.  
  526.  
  527.